package com.mcppro.aidatabase.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.util.List;
import java.util.Map;

/**
 * AI意图解析相关DTO
 * 
 * @author MCP Pro
 */
public class IntentDto {

    /**
     * 意图解析结果
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class IntentResult {
        /**
         * 操作类型
         */
        private OperationType operation;

        /**
         * 目标表名
         */
        @JsonProperty("table_name")
        private String tableName;

        /**
         * 查询条件
         */
        private List<Condition> conditions;

        /**
         * 要查询的字段
         */
        private List<String> fields;

        /**
         * 要更新的数据
         */
        @JsonProperty("update_data")
        private Map<String, Object> updateData;

        /**
         * 要插入的数据
         */
        @JsonProperty("insert_data")
        private Map<String, Object> insertData;

        /**
         * 排序字段
         */
        @JsonProperty("order_by")
        private List<OrderBy> orderBy;

        /**
         * 限制返回数量
         */
        private Integer limit;

        /**
         * 偏移量
         */
        private Integer offset;

        /**
         * 分组字段
         */
        @JsonProperty("group_by")
        private List<String> groupBy;

        /**
         * 聚合函数
         */
        private List<Aggregation> aggregations;

        /**
         * 原始用户问题
         */
        @JsonProperty("original_question")
        private String originalQuestion;

        /**
         * 置信度
         */
        private Double confidence;
    }

    /**
     * 操作类型枚举
     */
    public enum OperationType {
        SELECT,     // 查询
        INSERT,     // 插入
        UPDATE,     // 更新
        DELETE,     // 删除
        COUNT,      // 统计
        UNKNOWN     // 未知
    }

    /**
     * 查询条件
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Condition {
        /**
         * 字段名
         */
        private String field;

        /**
         * 操作符
         */
        private Operator operator;

        /**
         * 值
         */
        private Object value;

        /**
         * 逻辑连接符
         */
        private LogicalOperator logical;
    }

    /**
     * 操作符枚举
     */
    public enum Operator {
        EQUALS,         // =
        NOT_EQUALS,     // !=
        GREATER_THAN,   // >
        LESS_THAN,      // <
        GREATER_EQUAL,  // >=
        LESS_EQUAL,     // <=
        LIKE,           // LIKE
        NOT_LIKE,       // NOT LIKE
        IN,             // IN
        NOT_IN,         // NOT IN
        IS_NULL,        // IS NULL
        IS_NOT_NULL,    // IS NOT NULL
        BETWEEN         // BETWEEN
    }

    /**
     * 逻辑操作符枚举
     */
    public enum LogicalOperator {
        AND,
        OR
    }

    /**
     * 排序
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class OrderBy {
        /**
         * 字段名
         */
        private String field;

        /**
         * 排序方向
         */
        private SortDirection direction;
    }

    /**
     * 排序方向枚举
     */
    public enum SortDirection {
        ASC,    // 升序
        DESC    // 降序
    }

    /**
     * 聚合函数
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Aggregation {
        /**
         * 聚合函数类型
         */
        private AggregationType type;

        /**
         * 字段名
         */
        private String field;

        /**
         * 别名
         */
        private String alias;
    }

    /**
     * 聚合函数类型枚举
     */
    public enum AggregationType {
        COUNT,
        SUM,
        AVG,
        MAX,
        MIN
    }
}